//package com.aliyun.messagemgt.application.service.Impl.push.weixin;
//
//import com.alibaba.fastjson.JSON;
//import MsgBody;
//import MsgMiddleResult;
//import MsgRecordVO;
//import Receiver;
//import com.aliyun.messagemgt.application.service.MsgPushChannel;
//import com.aliyun.messagemgt.application.service.TokenUtil;
//import com.aliyun.messagemgt.application.service.UrlAppender;
//import com.aliyun.messagemgt.common.constant.PushConstant;
//import com.aliyun.messagemgt.common.base.HttpClientResult;
//import com.aliyun.messagemgt.util.HttpClientUtils;
//import com.aliyun.messagemgt.common.constants.CommonConstant;
//import com.aliyun.messagemgt.common.constants.WeixinConstant;
//import com.aliyun.messagemgt.common.constants.push.PushResultEnum;
//import com.aliyun.messagemgt.common.enums.ChannelTypeEnum;
//import com.aliyun.messagemgt.dto.PushChannelInfo;
//import com.aliyun.messagemgt.dto.vo.weixin.*;
//import org.apache.commons.collections.CollectionUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
//import static com.aliyun.messagemgt.common.constants.WeixinConstant.TOKEN_EXPIRED_ERROCODE;
//
///**
// * Created with IDEA
// *
// * @author:zhangxingxing 0027012120
// * @date:2019/1/24
// * @time:17:06
// */
//@Service
//public class WeixinMsgPushChannel implements MsgPushChannel {
//
//    private static final Logger logger = LoggerFactory.getLogger(WeixinMsgPushChannel.class);
//    /**
//     * 微信拼接的分隔符
//     */
//    private static final String WEIXIN_SEPARATOR = "|";
//    /**
//     * 微信拼接的分隔符(转义)
//     */
//    private static final String WEIXIN_ESCAPE_SEPARATOR = "\\|";
//
//
//    private final static int TEXT_CARD_TYPE_BOUNDARY = 4;
//
//    @Value("${debug.mode}")
//    private boolean debugMode;
//    //@Value("${wechat.send.url}")
//    private String sendUrl;
//    //@Value("${wechat.picture.url}")
//    private String picApiUrl;
//
//    @Autowired
//    private TokenUtil tokenUtil;
//    @Autowired
//    private UrlAppender urlAppender;
//
//    @Override
//    public Integer getChannelType() {
//        return ChannelTypeEnum.WEIXIN_CHANMEL.getType();
//    }
//
//    @Override
//    public void push(PushChannelInfo pushChannelInfo, MsgRecordVO msgRecordVO) {
//        List<MsgMiddleResult> results = msgRecordVO.getResults();
//        // 0. 获取corp信息，并获取token
//        String token = tokenUtil.getToken(pushChannelInfo);
//        List<Receiver> users = msgRecordVO.getReceivers();
//        if (token == null) {
//            logger.error("{} 无法获取到对应的token", pushChannelInfo);
//            MsgMiddleResult msgMiddleResult = generateMsgMiddleResult(users, PushResultEnum.PUSH_TOKEN_INVALID);
//            results.add(msgMiddleResult);
//            return;
//        }
//
//        String pushUserIds = getPushUserId(msgRecordVO, token);
//        if (StringUtils.isEmpty(pushUserIds)) {
//            if (msgRecordVO.getResults().size() < 1) {
//                List<Receiver> nullUser = new ArrayList<>();
//                nullUser.add(new Receiver().setReceiverType(String.valueOf(PushConstant.USER_RECEIVER)));
//                MsgMiddleResult msgMiddleResult = generateMsgMiddleResult(nullUser, PushResultEnum.NO_RECEIVER);
//                msgRecordVO.getResults().add(msgMiddleResult);
//            }
//            return;
//        }
//        List<MsgBody> contents = msgRecordVO.getContents();
//        if (CollectionUtils.isEmpty(contents)) {
//            MsgMiddleResult msgMiddleResult = generateMsgMiddleResult(users, PushResultEnum.PUSH_MSG_INVALID);
//            msgRecordVO.getResults().add(msgMiddleResult);
//            return;
//        }
//        Object weixinSendModelVO = null;
//        Long agentId = pushChannelInfo.getAgentId();
//        for (MsgBody msgBody : contents) {
//            String type = msgBody.getType();
//            if (StringUtils.isEmpty(type)) {
//                logger.error("msgBody Type 为空，无法判断类型，消息体为: {}", msgBody.toString());
//                continue;
//            }
//            switch (type) {
//                case WeixinConstant.TEXT:
//                    weixinSendModelVO = toText(agentId, msgBody, pushUserIds);
//                    break;
//                case WeixinConstant.IMAGE:
//                    weixinSendModelVO = toImage(agentId, msgRecordVO, pushUserIds);
//                    break;
//                case WeixinConstant.VOICE:
//                    weixinSendModelVO = toVoice(agentId, msgRecordVO, pushUserIds);
//                    break;
//                case WeixinConstant.VIDEO:
//                    weixinSendModelVO = toVideo(agentId, msgRecordVO, pushUserIds);
//                    break;
//                case WeixinConstant.FILE:
//                    weixinSendModelVO = toFile(agentId, msgRecordVO, pushUserIds);
//                    break;
//                case WeixinConstant.TEXTCARD:
//                    weixinSendModelVO = toTextcard(agentId, msgRecordVO, msgBody, pushUserIds);
//                    break;
//                case WeixinConstant.NEWS:
//                    weixinSendModelVO = toNews(agentId, msgRecordVO, msgBody, pushUserIds);
//                    break;
//                case WeixinConstant.MPNEWS:
//                    weixinSendModelVO = toMpNews(agentId, msgRecordVO, msgBody, pushUserIds);
//                    break;
//                case WeixinConstant.MARKDOWN:
//                    weixinSendModelVO = toMarkdown(agentId, msgRecordVO, msgBody, pushUserIds);
//                    break;
//                case WeixinConstant.MINIPROGRAM_NOTICE:
////                    weixinSendModelVO = toNews(pushChannelInfo.getAgentId(), msgRecordVO, token);
//                    break;
//                case WeixinConstant.TASKCARD:
////                    weixinSendModelVO = toNews(pushChannelInfo.getAgentId(), msgRecordVO, token);
//                    break;
//                default:
//                    break;
//            }
//
//        }
//
//
//        // 2. 调用发送 （如果errcode的 xxx 则重新获取并更新token）
//        WeixinReturnModelVO weixinReturnModelVO = sendMsg(token, weixinSendModelVO);
//        if (null == weixinReturnModelVO) {
//            weixinReturnModelVO = new WeixinReturnModelVO();
//            weixinReturnModelVO.setErrcode(0);
//        }
//        // token 过期重新获取
//        if (TOKEN_EXPIRED_ERROCODE.equals(weixinReturnModelVO.getErrcode())) {
//            logger.info("{} token过期了，重新获取", pushChannelInfo);
//            // 重新发起token更新请
//            token = tokenUtil.updateAndgetToken(pushChannelInfo);
//            if (token == null) {
//                logger.error("{} token已过期且无法获取到新的token", pushChannelInfo);
//                MsgMiddleResult msgMiddleResult = generateMsgMiddleResult(users, PushResultEnum.PUSH_TOKEN_INVALID);
//                results.add(msgMiddleResult);
//                return;
//            }
//            // 用新token再次发送
//            weixinReturnModelVO = sendMsg(token, weixinSendModelVO);
//        }
//        // 3. 发送结果处理
//        if (null == weixinReturnModelVO) {
//            weixinReturnModelVO = new WeixinReturnModelVO();
//            weixinReturnModelVO.setErrcode(0);
//        }
//        Integer errorCode = weixinReturnModelVO.getErrcode();
//        if (!WeixinConstant.SUCCESS_ERROCODE.equals(errorCode)) {
//            logger.error("{} 微信消息在推送中发生意料之外的异常 {}", msgRecordVO, weixinReturnModelVO);
//            MsgMiddleResult msgMiddleResult = generateMsgMiddleResult(users, PushResultEnum.WEIXIN_PUSH_ERROR);
//            results.add(msgMiddleResult);
//            return;
//        }
//        List<String> invaildUsers = weixinStringToList(weixinReturnModelVO.getInvaliduser());
//        if (invaildUsers.size() > 0) {
//            List<Receiver> invaildUserEntities = findInvalidUsers(users, invaildUsers);
//            MsgMiddleResult msgMiddleResult = generateMsgMiddleResult(invaildUserEntities, PushResultEnum.WEIXIN_USER_INVALID);
//            results.add(msgMiddleResult);
//        }
//        if (users.size() > 0) {
//            MsgMiddleResult msgMiddleResult = generateMsgMiddleResult(users, PushResultEnum.PUSH_SUCCESS);
//            results.add(msgMiddleResult);
//        }
//    }
//
//    /**
//     * 由于微信返回值是不区分大小写的,所以在去除无效用户的时候要做忽略大小写
//     *
//     * @param users
//     * @param invalidUsers
//     * @return
//     */
//    private List<Receiver> findInvalidUsers(List<Receiver> users, List<String> invalidUsers) {
//        List<Receiver> invalidUserEntities = new ArrayList<>();
//        for (String invalidUserId : invalidUsers) {
//            // 因为确实是arrayList 所以用通过下标寻址，传统循环， remove(index)的方法
//            int userSize = users.size();
//            if (userSize < 1) {
//                break;
//            }
//            for (int i = 0; i < userSize; i++) {
//                Receiver user = users.get(i);
//                if (invalidUserId.equalsIgnoreCase(user.getReceiverId())) {
//                    invalidUserEntities.add(user);
//                    users.remove(user);
//                    break;
//                }
//            }
//        }
//        return invalidUserEntities;
//    }
//
//    private String getPushUserId(MsgRecordVO msgRecordVO, String token) {
//        List<FourAObjectEntity> pushUserIds = msgRecordVO.getPushUserIds();
//        if (CollectionUtils.isEmpty(pushUserIds)) {
//            return null;
//        }
//        List<String> phones = pushUserIds.stream().map(FourAObjectEntity::getKey).collect(Collectors.toList());
//        if (phones.contains(CommonConstant.ALL)) {
//            return WeixinConstant.AT_ALL;
//        }
//        List<String> ids = new ArrayList<>();
//        for (String phone : phones) {
//            String id = getUserIdByMobile(token, phone);
//            if (StringUtils.isNotEmpty(id)) {
//                ids.add(id);
//            }
//        }
//        if (CollectionUtils.isEmpty(ids)) {
//            return null;
//        }
//        return String.join("|", ids);
//    }
//
//    public static String getUserIdByMobile(String token, String phone) {
//        String userIdUrl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token=" + token;
//        Map<String, String> map = new HashMap<>();
//        map.put("mobile", phone);
//        //根据手机号查询微信userid
//        HttpClientResult client = null;
//        try {
//            client = HttpClientUtils.doPostWithJsonParams(userIdUrl, map);
//        } catch (Exception e) {
//            logger.error(" 获取微信用户id时出现错误 {} ", e.toString());
//        }
//        if (null == client) {
//            return null;
//        }
//        WeixinReturnModelVO weixinReturnModelVO = JSON.parseObject(client.getContent(), WeixinReturnModelVO.class);
//        System.out.println("args = [" + weixinReturnModelVO.toString() + "]");
//        return weixinReturnModelVO.getUserid();
//    }
//
//    /**
//     * 获取发送用户
//     *
//     * @param msgRecordVO
//     * @return
//     */
//    private List<String> listUserIds(MsgRecordVO msgRecordVO) {
//        List<Receiver> receivers = msgRecordVO.getReceivers();
//        List<String> userIds = new ArrayList<>(receivers.size());
//        receivers.forEach(receiver -> {
//            userIds.add(receiver.getReceiverId());
//        });
//
//        return userIds;
//    }
//
//    /**
//     * 消息转化为微信文本卡片格式
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @param msgBody
//     * @param pushUserIds
//     * @return
//     */
//    private static WeixinTextcardSendModelVO toTextcard(Long agentId, MsgRecordVO msgRecordVO, MsgBody msgBody, String pushUserIds) {
//        WeixinTextcardSendModelVO weixinTextcardSendModelVO = new WeixinTextcardSendModelVO();
//        weixinTextcardSendModelVO.setBtntxt(msgBody.getBtntxt())
//                .setDescription(msgBody.getContent())
//                .setTitle(msgRecordVO.getMsgTitle())
//                .setUrl(msgBody.getMessageUrl())
//                .setTouser(pushUserIds)
//                .setAgentid(agentId);
//        return weixinTextcardSendModelVO;
//    }
//
//    /**
//     * 消息转化为微信文本
//     * 注意：文本只取contents的第一个参数
//     *
//     * @param msgBody msgBody
//     * @return
//     */
//    private WeixinTextSendModelVO toText(Long agentId, MsgBody msgBody, String pushUserId) {
//        WeixinTextSendModelVO weixinTextSendModelVO = new WeixinTextSendModelVO();
//        weixinTextSendModelVO.setContent(msgBody.getContent());
//        weixinTextSendModelVO.setTouser(pushUserId).setAgentid(agentId);
//        return weixinTextSendModelVO;
//    }
//
//    /**
//     * 消息转化为微信语音
//     * 注意：图片只取contents的第一个参数
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @return
//     */
//    private static WeixinVoiceSendModelVO toVoice(Long agentId, MsgRecordVO msgRecordVO, String pushUserIds) {
//        WeixinVoiceSendModelVO weixinVoiceSendModelVO = new WeixinVoiceSendModelVO();
//        if (msgRecordVO.getContents().size() >= 1) {
//            weixinVoiceSendModelVO.setMediaId(msgRecordVO.getContents().get(0).getContent());
//        }
//        weixinVoiceSendModelVO.setTouser(pushUserIds).setAgentid(agentId);
//        return weixinVoiceSendModelVO;
//    }
//
//    /**
//     * 消息转化为微信图片
//     * 注意：图片只取contents的第一个参数
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @return
//     */
//    private static WeixinImageSendModelVO toImage(Long agentId, MsgRecordVO msgRecordVO, String pushUserIds) {
//        WeixinImageSendModelVO weixinImageSendModelVO = new WeixinImageSendModelVO();
//        if (msgRecordVO.getContents().size() >= 1) {
//            weixinImageSendModelVO.setMediaId(msgRecordVO.getContents().get(0).getContent());
//        }
//        weixinImageSendModelVO.setTouser(pushUserIds).setAgentid(agentId);
//        return weixinImageSendModelVO;
//    }
//
//    /**
//     * 消息转化为微信视频
//     * 注意：视频只取contents的第一个参数
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @return
//     */
//    private static WeixinVideoSendModelVO toVideo(Long agentId, MsgRecordVO msgRecordVO, String pushUserIds) {
//        WeixinVideoSendModelVO weixinVideoSendModelVO = new WeixinVideoSendModelVO();
//        if (msgRecordVO.getContents().size() >= 1) {
//            weixinVideoSendModelVO.setMediaId(msgRecordVO.getContents().get(0).getContent())
//                    .setTitle(msgRecordVO.getMsgTitle())
//                    .setDescription(msgRecordVO.getMsgDescription());
//        }
//        weixinVideoSendModelVO.setTouser(pushUserIds).setAgentid(agentId);
//        return weixinVideoSendModelVO;
//    }
//
//    /**
//     * 消息转化为微信文件
//     * 注意：文件只取contents的第一个参数
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @return
//     */
//    private static WeixinFileSendModelVO toFile(Long agentId, MsgRecordVO msgRecordVO, String pushUserIds) {
//        WeixinFileSendModelVO weixinFileSendModelVO = new WeixinFileSendModelVO();
//        if (msgRecordVO.getContents().size() >= 1) {
//            weixinFileSendModelVO.setMediaId(msgRecordVO.getContents().get(0).getContent());
//        }
//        weixinFileSendModelVO.setTouser(pushUserIds).setAgentid(agentId);
//        return weixinFileSendModelVO;
//    }
//
//    /**
//     * 消息转化为微信图文
//     * 图文消息，目前仅支持推送一篇
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @return
//     */
//    private WeixinNewsSendModelVO toNews(Long agentId, MsgRecordVO msgRecordVO, MsgBody msgBody, String pushUserIds) {
//        WeixinNewsSendModelVO weixinNewsSendModelVO = new WeixinNewsSendModelVO();
//        // 将内容替换为图片接口
//        weixinNewsSendModelVO.setTitleByIndex(msgRecordVO.getMsgTitle())
//                .setDescriptionByIndex(msgBody.getContent())
//                .setPicUrlByIndex(msgBody.getPicUrl())
//                .setUrlByIndex(msgBody.getMessageUrl());
//        weixinNewsSendModelVO.setTouser(pushUserIds).setAgentid(agentId);
//        return weixinNewsSendModelVO;
//    }
//
//    /**
//     * 消息转化为微信图文,新,可以使用上传到微信的图片
//     * 注意：图文的图取自content的第一个参数，返回图片接口地址；
//     * 文章url取自第二个参数；
//     * 图文消息，目前仅支持推送一篇
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @return
//     */
//    private WeixinMpNewsSendModelVO toMpNews(Long agentId, MsgRecordVO msgRecordVO, MsgBody msgBody, String pushUserIds) {
//        WeixinMpNewsSendModelVO weixinMpNewsSendModelVO = new WeixinMpNewsSendModelVO();
//        // 将内容替换为图片接口
//        weixinMpNewsSendModelVO.setTitle(msgRecordVO.getMsgTitle())
//                .setDigest(msgRecordVO.getMsgContent())
//                .setAuthor(msgBody.getAuthor())
//                .setContent_source_url(msgBody.getMessageUrl())
//                .setContent(msgRecordVO.getMsgContent())
//                .setThumb_media_id(msgBody.getContent());
//        weixinMpNewsSendModelVO.setTouser(pushUserIds).setAgentid(agentId);
//        return weixinMpNewsSendModelVO;
//    }
//
//    /**
//     * markdown
//     *
//     * @param agentId
//     * @param msgRecordVO
//     * @return
//     */
//    private static WeixinMarkdownSendModelVO toMarkdown(Long agentId, MsgRecordVO msgRecordVO, MsgBody msgBody, String pushUserIds) {
//
//        WeixinMarkdownSendModelVO weixinMarkdownSendModelVO = new WeixinMarkdownSendModelVO();
//        weixinMarkdownSendModelVO.setContent(msgBody.getContent());
//        weixinMarkdownSendModelVO.setTouser(pushUserIds).setAgentid(agentId);
//        return weixinMarkdownSendModelVO;
//
//    }
//
//    /**
//     * 将list参数转化成企业接口识别的string参数
//     *
//     * @return
//     */
//    private String listToWeixinString(List<String> ids) {
//        StringBuilder stringBuilder = new StringBuilder();
//        if (ids == null || ids.size() == 0) {
//            return null;
//        }
//        stringBuilder.append(ids.remove(0));
//        for (String id : ids) {
//            stringBuilder.append(WEIXIN_SEPARATOR).append(id);
//        }
//        return stringBuilder.toString();
//    }
//
//    /**
//     * 将企业接口返回的的string参数转化为list
//     *
//     * @return
//     */
//    private List<String> weixinStringToList(String strIds) {
//        if (StringUtils.isEmpty(strIds)) {
//            return new ArrayList<>();
//        }
//        return Arrays.asList(strIds.split(WEIXIN_ESCAPE_SEPARATOR));
//    }
//
//    /**
//     * 微信发送消息
//     *
//     * @param token
//     * @param param
//     * @return
//     */
//    private WeixinReturnModelVO sendMsg(String token, Object param) {
//        String url = sendUrl + token;
//        WeixinReturnModelVO weixinReturnModelVO = null;
//        logger.info("微信请求字段：{}", JSON.toJSONString(param, false));
//        try {
//            HttpClientResult httpClientResult = HttpClientUtils.doPostWithJsonParams(url, param);
//            weixinReturnModelVO = JSON.parseObject(httpClientResult.getContent(), WeixinReturnModelVO.class);
//        } catch (Exception e) {
//            logger.error("微信消息推送异常", e);
//        }
//
//        return weixinReturnModelVO;
//    }
//
//    private MsgMiddleResult generateMsgMiddleResult(List<Receiver> reveivers, PushResultEnum pushResult) {
//        return new MsgMiddleResult()
//                .setReceivers(reveivers)
//                .setPushResultCode(pushResult.getErrorCode())
//                .setPushResultDescription(pushResult.getDescription());
//    }
//
//}
